abstract class Shape {
    public abstract void draw();
}
class Flower extends Shape {
    public void draw() {
        System.out.println("❀");
    }
}
class Rect extends Shape {
    public void draw() {
        System.out.println("矩形");
    }
}
class Triangle extends Shape {
    public void draw() {
        System.out.println("△");
    }
}
class Cycle extends Shape {
    public void draw() {
        System.out.println("○");
    }
}
public class Test {
    public static void func(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {

    }
    public static void main1(String[] args) {
        func(new Flower());
        func(new Rect());
        func(new Triangle());
        func(new Cycle());
        //1抽象类
        //1.1 不能具体描述的类，称为抽象类
        //1.2 被abstract修饰的方法称为抽象方法，那么类也需要被abstract修饰
        //1.3 抽象类不一定有抽象方法，有抽象方法一定有抽象类
        //1.4 抽象类不能被实例化，不能被static、final、private修饰
        //1.5 类继承抽象类，就必须重写抽象方法，如果不想重写抽象方法，需要在类前加abstract
        //1.6 一个类继承一个继承的抽象类的类，该类必须重写继承类和抽象类的抽象方法
        //1.7 抽象类可以有构造方法，不是在实例化时进行初始化，因为抽象类不能进行实例化
        //1.8 一样有类，方法，变量
        // 所以构造方法时通过类继承后进行构造方法初始化

    }
}
